{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "elapsed": 6,
     "status": "ok",
     "timestamp": 1649954376395,
     "user": {
      "displayName": "Sam Lu",
      "userId": "15789059763790170725"
     },
     "user_tz": -480
    },
    "id": "XSX0v-rJ8YDu",
    "outputId": "e553e987-918f-4741-9198-c98876644680"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "随机生成了一个10臂伯努利老虎机\n",
      "获奖概率最大的拉杆为1号,其获奖概率为0.7203\n"
     ]
    }
   ],
   "source": [
    "# 导入需要使用的库,其中numpy是支持数组和矩阵运算的科学计算库,而matplotlib是绘图库\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "\n",
    "class BernoulliBandit:\n",
    "    \"\"\" 伯努利多臂老虎机,输入K表示拉杆个数 \"\"\"\n",
    "    def __init__(self, K):\n",
    "        self.probs = np.random.uniform(size=K)  # 随机生成K个0～1的数,作为拉动每根拉杆的获奖\n",
    "        # 概率\n",
    "        self.best_idx = np.argmax(self.probs)  # 获奖概率最大的拉杆\n",
    "        self.best_prob = self.probs[self.best_idx]  # 最大的获奖概率\n",
    "        self.K = K\n",
    "\n",
    "    def step(self, k):\n",
    "        # 当玩家选择了k号拉杆后,根据拉动该老虎机的k号拉杆获得奖励的概率返回1（获奖）或0（未\n",
    "        # 获奖）\n",
    "        if np.random.rand() < self.probs[k]: ## 依概率self.probs[k]返回的奖励1\n",
    "            return 1\n",
    "        else:\n",
    "            return 0   ## 依概率1 - self.probs[k]返回的奖励0\n",
    "\n",
    "\n",
    "np.random.seed(1)  # 设定随机种子,使实验具有可重复性\n",
    "K = 10\n",
    "bandit_10_arm = BernoulliBandit(K)\n",
    "print(\"随机生成了一个%d臂伯努利老虎机\" % K)\n",
    "print(\"获奖概率最大的拉杆为%d号,其获奖概率为%.4f\" %\n",
    "      (bandit_10_arm.best_idx, bandit_10_arm.best_prob))\n",
    "\n",
    "# 随机生成了一个10臂伯努利老虎机\n",
    "# 获奖概率最大的拉杆为1号,其获奖概率为0.7203"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "executionInfo": {
     "elapsed": 3,
     "status": "ok",
     "timestamp": 1649954377232,
     "user": {
      "displayName": "Sam Lu",
      "userId": "15789059763790170725"
     },
     "user_tz": -480
    },
    "id": "8gqKHavm8YDy"
   },
   "outputs": [],
   "source": [
    "class Solver:\n",
    "    \"\"\" 多臂老虎机算法基本框架 \"\"\"\n",
    "    def __init__(self, bandit):\n",
    "        self.bandit = bandit\n",
    "        self.counts = np.zeros(self.bandit.K)  # 每根拉杆的尝试次数\n",
    "        self.regret = 0.  # 当前步的累积懊悔\n",
    "        self.actions = []  # 维护一个列表,记录每一步的动作\n",
    "        self.regrets = []  # 维护一个列表,记录每一步的累积懊悔\n",
    "\n",
    "    def update_regret(self, k):\n",
    "        # 计算累积懊悔并保存,k为本次动作选择的拉杆的编号\n",
    "        self.regret += self.bandit.best_prob - self.bandit.probs[k]\n",
    "        self.regrets.append(self.regret)\n",
    "\n",
    "    def run_one_step(self):\n",
    "        # 返回当前动作选择哪一根拉杆,由每个具体的策略实现\n",
    "        raise NotImplementedError\n",
    "\n",
    "    def run(self, num_steps):\n",
    "        # 运行一定次数,num_steps为总运行次数\n",
    "        for _ in range(num_steps):\n",
    "            k = self.run_one_step()     ## 根据策略选择拉杆，然后拉动拉杆，算拉杆奖励的期望值\n",
    "            self.counts[k] += 1         ## 拉动拉杆的次数+1\n",
    "            self.actions.append(k)      ## 记录每一步的动作action，也就是拉动的拉杆标号\n",
    "            self.update_regret(k)       ## 更新懊悔地累加值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "executionInfo": {
     "elapsed": 2,
     "status": "ok",
     "timestamp": 1649954382967,
     "user": {
      "displayName": "Sam Lu",
      "userId": "15789059763790170725"
     },
     "user_tz": -480
    },
    "id": "YdD-JGH28YDz"
   },
   "outputs": [],
   "source": [
    "class EpsilonGreedy(Solver):\n",
    "    \"\"\" epsilon贪婪算法,继承Solver类 \"\"\"\n",
    "    def __init__(self, bandit, epsilon=0.01, init_prob=1.0):\n",
    "        super(EpsilonGreedy, self).__init__(bandit)\n",
    "        self.epsilon = epsilon\n",
    "        #初始化拉动所有拉杆的期望奖励估值\n",
    "        self.estimates = np.array([init_prob] * self.bandit.K)\n",
    "\n",
    "    def run_one_step(self):\n",
    "        if np.random.random() < self.epsilon:\n",
    "            k = np.random.randint(0, self.bandit.K)  # 随机选择一根拉杆\n",
    "        else:\n",
    "            k = np.argmax(self.estimates)  # 选择期望奖励估值最大的拉杆\n",
    "        r = self.bandit.step(k)  # 得到本次动作的奖励\n",
    "        self.estimates[k] += 1. / (self.counts[k] + 1) * (r - self.estimates[k]) ## 算第K根拉杆的期望奖励，增量更新的\n",
    "        return k"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 312
    },
    "executionInfo": {
     "elapsed": 676,
     "status": "ok",
     "timestamp": 1649954384006,
     "user": {
      "displayName": "Sam Lu",
      "userId": "15789059763790170725"
     },
     "user_tz": -480
    },
    "id": "wIHh_wRA8YDz",
    "outputId": "d5d65ff2-744d-44e2-ec8a-eb78d13397c2"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epsilon-贪婪算法的累积懊悔为： 25.526630933945313\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_results(solvers, solver_names):\n",
    "    \"\"\"生成累积懊悔随时间变化的图像。输入solvers是一个列表,列表中的每个元素是一种特定的策略。\n",
    "    而solver_names也是一个列表,存储每个策略的名称\"\"\"\n",
    "    for idx, solver in enumerate(solvers):    ## 遍历所有的解决方案，实际上只有一个解决方案\n",
    "        time_list = range(len(solver.regrets))  ## 每一步的懊悔记录，拿到横轴的数值\n",
    "        plt.plot(time_list, solver.regrets, label=solver_names[idx]) # 绘制，横轴是时间步，纵轴是懊悔值\n",
    "    plt.xlabel('Time steps')                       ##  横轴的标签\n",
    "    plt.ylabel('Cumulative regrets')               ##  纵轴的标签\n",
    "    plt.title('%d-armed bandit' % solvers[0].bandit.K)   ##  标题\n",
    "    plt.legend()  ##  图例\n",
    "    plt.show()    ##  显示图片的\n",
    "\n",
    "\n",
    "np.random.seed(1)                 ## 初始化随机数的 seed 种子\n",
    "epsilon_greedy_solver = EpsilonGreedy(bandit_10_arm, epsilon=0.01)  ## 策略器初始化\n",
    "epsilon_greedy_solver.run(5000)   ## 拉动拉杆共五千次，然后运算累加懊悔，每个杆的期望奖励等\n",
    "print('epsilon-贪婪算法的累积懊悔为：', epsilon_greedy_solver.regret)  \n",
    "plot_results([epsilon_greedy_solver], [\"EpsilonGreedy\"])  \n",
    "\n",
    "# epsilon-贪婪算法的累积懊悔为：25.526630933945313"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 295
    },
    "executionInfo": {
     "elapsed": 872,
     "status": "ok",
     "timestamp": 1649954384873,
     "user": {
      "displayName": "Sam Lu",
      "userId": "15789059763790170725"
     },
     "user_tz": -480
    },
    "id": "hRDFIebd8YD0",
    "outputId": "33430933-becc-41d3-8a85-d46da8f2013c"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "np.random.seed(0)                                      ## 给定随机种子，保证实验可以复现\n",
    "epsilons = [1e-4, 0.01, 0.1, 0.25, 0.5]                ## 不同的ε值\n",
    "epsilon_greedy_solver_list = [                                       \n",
    "    EpsilonGreedy(bandit_10_arm, epsilon=e) for e in epsilons             ## 初始化不同的策略解决方案\n",
    "]\n",
    "epsilon_greedy_solver_names = [\"epsilon={}\".format(e) for e in epsilons]    ## 不同ε值对应的名称\n",
    "for solver in epsilon_greedy_solver_list:                                   ## 遍历策略解决方案，每个策略运行五千次\n",
    "    solver.run(5000)\n",
    "\n",
    "plot_results(epsilon_greedy_solver_list, epsilon_greedy_solver_names)    ## 绘制图像的"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 131
    },
    "executionInfo": {
     "elapsed": 7,
     "status": "error",
     "timestamp": 1649954384874,
     "user": {
      "displayName": "Sam Lu",
      "userId": "15789059763790170725"
     },
     "user_tz": -480
    },
    "id": "hLIkERHH8YD1",
    "outputId": "0eb1b916-3b0f-4939-83ec-edfad0e79d4e"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epsilon值衰减的贪婪算法的累积懊悔为： 10.114334931260183\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "class DecayingEpsilonGreedy(Solver):\n",
    "    \"\"\" epsilon值随时间衰减的epsilon-贪婪算法,继承Solver类 \"\"\"\n",
    "    def __init__(self, bandit, init_prob=1.0):  \n",
    "        super(DecayingEpsilonGreedy, self).__init__(bandit)   ## 初始化基类Solver\n",
    "        self.estimates = np.array([init_prob] * self.bandit.K)  ## 初始化每根拉杆的期望奖励，=1\n",
    "        self.total_count = 0  ## 拉杆的总次数\n",
    "\n",
    "    def run_one_step(self):\n",
    "        self.total_count += 1   ## 拉杆的次数+1，此时ε=拉杆次数的倒数，拉杆次数越多ε越小\n",
    "        if np.random.random() < 1 / self.total_count:  # epsilon值随时间衰减\n",
    "            k = np.random.randint(0, self.bandit.K)    ## 此时有ε的概率随机选择拉杆\n",
    "        else:\n",
    "            k = np.argmax(self.estimates)    ## 此时有1-ε的概率选择期望奖励最大的拉杆\n",
    "\n",
    "        r = self.bandit.step(k)           ## 获得第k根拉杆的奖励\n",
    "        self.estimates[k] += 1. / (self.counts[k] + 1) * (r - self.estimates[k])  ## 增量更新期望奖励\n",
    "\n",
    "        return k  \n",
    "\n",
    "\n",
    "np.random.seed(1)\n",
    "decaying_epsilon_greedy_solver = DecayingEpsilonGreedy(bandit_10_arm)  ## 初始化延迟策略解决方案\n",
    "decaying_epsilon_greedy_solver.run(5000)   ## 运行五千次拉杆操作的\n",
    "print('epsilon值衰减的贪婪算法的累积懊悔为：', decaying_epsilon_greedy_solver.regret)\n",
    "plot_results([decaying_epsilon_greedy_solver], [\"DecayingEpsilonGreedy\"])  ## 绘制图像的"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 131
    },
    "executionInfo": {
     "elapsed": 461,
     "status": "error",
     "timestamp": 1649954385672,
     "user": {
      "displayName": "Sam Lu",
      "userId": "15789059763790170725"
     },
     "user_tz": -480
    },
    "id": "O8XF2JjA8YD1",
    "outputId": "1a6b1248-c5c2-40cd-d3e7-5bea8e16e4e9"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "上置信界算法的累积懊悔为： 70.45281214197854\n"
     ]
    },
    {
     "data": {
      "image/png": "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Dsbo0aNRXV19xf0SkRPZ5dGTRNSmpKenC41GU6990qRJ4o477rC8Hzx4sBg0aJDlfU1NjfD19RUPPPCApa2goEAAEJmZmUIIIf75z3+KESNGWG03Ly9PAKj3RPQ6vXr1Es8//3yDy+qevH7hwgVLm8FgED4+PuLHH3+0WnfKlCliwoQJVp9bu3atZfmff/4pvL29xUcffXTV/RKRc3CMDBE5VO/evS0/e3h4oF27dujVq5elTavVAgCKi4sBAD///DO2b9/eYM/GyZMn0bVr13rtjz76KB555BFs2bIFiYmJSE5Ottrv5U6cOIGKigoMHz7cqr2qqgp9+/a1aktISLD8HBQUhG7duuHXX39t1n6JyP54aYmIHMrLy8vqvUwms2qruxvKbDYDAMrKyjB69GgcPHjQ6nX8+HHcfPPNDe7joYcewu+//44HHngAhw8fRv/+/bFkyZJGayorKwMAbNy40WofR48etRonczW27peI7I9Bhohaleuuuw6//PILoqKiEBMTY/Xy9fVt9HMRERF4+OGH8dlnn2Hu3LlYsWIFAEChUAAATCaTZd24uDgolUrk5ubW20dERITVdnfv3m35+cKFCzh27Bi6d+9+1f0SkXMwyBBRq5KSkoLz589jwoQJ2LdvH06ePIlvvvkGkydPtgojl5o9eza++eYb5OTkYP/+/di+fbslbHTq1AkymQxfffUVzp49i7KyMvj7++Oxxx7DnDlz8N577+HkyZPYv38/lixZgvfee89q2wsXLsS2bdtw5MgRPPjgg2jfvr3lzqwr7ZeInINBhohalfDwcOzatQsmkwkjRoxAr169MHv2bAQEBEAub/hXlslkQkpKCrp3746RI0eia9euWLZsGQCgQ4cOeOGFF/DUU09Bq9VixowZAIB//vOfeO6555CWlmb53MaNGxEdHW217UWLFmHWrFno168fCgsLsWHDBqtensb2S0TOIROilU3DSUTUCnBGYCLXwB4ZIiIiclkMMkREROSyeGmJiIiIXBZ7ZIiIiMhlMcgQERGRy2KQISIiIpfFIENEREQui0GGiIiIXBaDDBEREbksBhkiIiJyWQwyRERE5LIYZIiIiMhl/T+PR/w0WqsoIwAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "class UCB(Solver):\n",
    "    \"\"\" UCB算法,继承Solver类 \"\"\"\n",
    "    def __init__(self, bandit, coef, init_prob=1.0):  ##  初始化ucb类的\n",
    "        super(UCB, self).__init__(bandit)             ##  初始化基类Solver\n",
    "        self.total_count = 0                          ##  总的拉杆次数\n",
    "        self.estimates = np.array([init_prob] * self.bandit.K)              ## 初始化每根拉杆的期望奖励\n",
    "        self.coef = coef      ## ucb的权重\n",
    "\n",
    "    def run_one_step(self):\n",
    "        self.total_count += 1       ##  运行的总次数+1\n",
    "\n",
    "## 算出所有拉杆的期望奖励上界\n",
    "        ucb = self.estimates + self.coef * np.sqrt(                \n",
    "            np.log(self.total_count) / (2 * (self.counts + 1)))  # 计算上置信界\n",
    "        k = np.argmax(ucb)  # 选出上置信界最大的拉杆\n",
    "        r = self.bandit.step(k)        ## 拿到奖励的数值\n",
    "        self.estimates[k] += 1. / (self.counts[k] + 1) * (r - self.estimates[k])   ## 增量更新对应拉杆的期望奖励\n",
    "        return k\n",
    "\n",
    "\n",
    "np.random.seed(1)   ## 给定随机数种子，方便复现的\n",
    "coef = 1  # 控制不确定性比重的系数\n",
    "UCB_solver = UCB(bandit_10_arm, coef)    ## 实例化ucb类的\n",
    "UCB_solver.run(5000)              ## 共拉杆五千次\n",
    "print('上置信界算法的累积懊悔为：', UCB_solver.regret)\n",
    "plot_results([UCB_solver], [\"UCB\"])  ## 绘制图像的\n",
    "\n",
    "# 上置信界算法的累积懊悔为： 70.45281214197854"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 312
    },
    "executionInfo": {
     "elapsed": 553,
     "status": "ok",
     "timestamp": 1649954387265,
     "user": {
      "displayName": "Sam Lu",
      "userId": "15789059763790170725"
     },
     "user_tz": -480
    },
    "id": "K32HquQ-8YD2",
    "outputId": "b4c0d5cc-961d-4f25-a1db-22b6e12e82eb"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "汤普森采样算法的累积懊悔为： 57.19161964443925\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "class ThompsonSampling(Solver):\n",
    "    \"\"\" 汤普森采样算法,继承Solver类 \"\"\"\n",
    "    def __init__(self, bandit):\n",
    "        super(ThompsonSampling, self).__init__(bandit)\n",
    "        self._a = np.ones(self.bandit.K)  # 列表,表示每根拉杆奖励为1的次数\n",
    "        self._b = np.ones(self.bandit.K)  # 列表,表示每根拉杆奖励为0的次数\n",
    "\n",
    "    def run_one_step(self):\n",
    "        samples = np.random.beta(self._a, self._b)  # 按照Beta分布采样一组奖励样本\n",
    "        k = np.argmax(samples)  # 选出采样奖励最大的拉杆\n",
    "        r = self.bandit.step(k)\n",
    "\n",
    "        self._a[k] += r  # 更新Beta分布的第一个参数\n",
    "        self._b[k] += (1 - r)  # 更新Beta分布的第二个参数\n",
    "        return k\n",
    "\n",
    "\n",
    "np.random.seed(1)   ## 给定随机数种子，方便复现的\n",
    "thompson_sampling_solver = ThompsonSampling(bandit_10_arm)     ## 实例化Thompson类的\n",
    "thompson_sampling_solver.run(5000)              ## 共拉杆五千次\n",
    "print('汤普森采样算法的累积懊悔为：', thompson_sampling_solver.regret)\n",
    "plot_results([thompson_sampling_solver], [\"ThompsonSampling\"])\n",
    "\n",
    "# 汤普森采样算法的累积懊悔为：57.19161964443925"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "colab": {
   "collapsed_sections": [],
   "name": "第2章-多臂老虎机问题.ipynb",
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
